const Promise = require('./promise-es5');

// 这种情况就会出现循环引用，then的返回值是p2，也就是自己
// 注释① start=============
// let p1 = new Promise((resolve, reject) => {
//   resolve(1);
// });
// let p2 = p1.then(
//   (res) => p2,
//   (err) => {}
// );
// 注释① end===============

// 注释② start==============
// obj.then  Object.defineProperty重新定义get取值操作，obj.then获取值就有可能会报错
// let obj = {};
// Object.defineProperty(obj, 'then', {
//   get() {
//     throw new Error('出错了')
//   }
// })
// 注释② end==============

// 注释③ start==============
// var p1 = new Promise(function (resolve, reject) {
//   resolve(1);
// });

// var p2 = p1
//   .then(
//     (res) => {
//       return new Promise(function (resolve, reject) {
//         setTimeout(function () {
//           resolve(
//             new Promise(function (resolve, reject) {
//               resolve(
//                 new Promise(function (resolve, reject) {
//                   setTimeout(function () {
//                     resolve(
//                       new Promise(function (resolve, reject) {
//                         resolve(666);
//                       })
//                     );
//                   }, 1000);
//                 })
//               );
//             })
//           );
//         }, 1000);
//       });
//     },
//     (err) => {
//       console.log(err);
//     }
//   )
//   .then(
//     (res) => {
//       console.log(res, '0000000000');
//     },
//     (err) => {
//       console.log(err, '99999999');
//     }
//   );
// 注释③ end==============

// finally用法
/* p1.finally(function () {
  console.log('finally');
  return new Promise(function (resolve, reject) {
    reject(2);
  });
}).then(
  function (res) {
    console.log(res, 'success');
  },
  function (err) {
    console.log(err, 'error');
  }
); */

// allSettled用法
/* function read(name) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      if (name === '1') {
        reject('2');
      } else {
        resolve(name);
      }
    }, 1000);
  });
}

Promise.allSettled([read('2'), read('2')]).then(
  function (data) {
    console.log(data);
  },
  function (e) {
    console.log(e);
  }
); */


// Promise.race([])
//   .then((res) => {
//     console.log(res, '1111');
//   })
//   .catch((err) => {
//     console.log(err, '2222');
//   });

  // Promise.all([])
  // .then((res) => {
  //   console.log(res, '1111');
  // })
  // .catch((err) => {
  //   console.log(err, '2222');
  // });


  /*let p1 = Promise.resolve(2).then(res => {
    console.log("res1", res);
  }).catch(err => {
    console.log("catch1", err);
  }).then(res => {
    console.log("res2", res);
  }, err => {
    console.log("err2:", err);
  })*/

  let p1 = Promise.resolve(2).then(res => {
    console.log("res1", res);
    throw new Error('错误了')
  }).catch(err => {
    console.log("catch1", err);
  }).then(res => {
    console.log("res2", res);
  }, err => {
    console.log("err2:", err);
  }).catch(err => {
    console.log("catch2", err);
  })